package com.ziroom.crm.mq.core.data;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.beans.Transient;
import java.io.Serializable;
import java.util.Date;
import java.util.Objects;

/**
 * <p></p>
 * <p>
 * <PRE>
 * <BR>    修改记录
 * <BR>-----------------------------------------------
 * <BR>    修改日期         修改人          修改内容
 * </PRE>
 *
 * @author WeiShaoying
 * @version 1.0
 * @date Created in 2020年08月28日 17:03
 * @since 1.0
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Message implements Serializable {

    private static final long serialVersionUID = -4814250696794806413L;
    /**
     * 消息id, 唯一id
     */
    private String id;

    /**
     * 消息体,因为ReliableRabbitTemplate配置的MessageConverter为toJson
     * 所以也是一个json
     */
    private String messageBody;

    /**
     * 消息失败原因
     */
    private String failReason;

    /**
     * 重试次数
     */
    private Integer retryCount;

    /**
     * 下一次重试时间
     */
    private Date nextRetryDate;

    /**
     * 重试彻底失败标记（死信标记）
     */
    private boolean retryFailed = false;

    /**
     * 创建时间
     */
    private Date createTime = new Date();

    /**
     * 消息发送失败或是nack才会有,否则为空
     */
    private Exception exception;

    public Message(String id, String messageBody) {
        this.id = id;
        this.messageBody = messageBody;
    }

    public void setException(Exception exception) {
        this.exception = exception;
        if (Objects.nonNull(exception)) {
            this.failReason = Objects.isNull(exception.getCause())?exception.getMessage():exception.getCause().getMessage();
            this.failReason = Objects.toString(this.failReason);
        }
    }
    @Transient
    public Exception getException() {
        return exception;
    }


}
